經過了那麼多天,大致上整個開源套件的基本功能都有了,今天就來讓我們的套件內容更豐富。會多新增專門搜尋投手跟打者的 statcast_pitcher_search
跟 statcast_batter_search
跟搜尋小聯盟 Statcast 資料的 minor_statcast_search
。
這兩個 function 的實作其實不難,會運用到我們之前在 Day 18 - 用 requests 取得 Raw Data 後使用 pandas 轉成 DataFrame 寫的 statcast_search
。基本上後面的 Statcast function 都會是這個 function 的延伸。
不一樣的地方是,因為想要是給專門搜尋投手的功能,我們就需要把 player_type
限制成只會是 "pitcher"
,然後會需要檢查 pitchers_lookup
一定要給值才能執行。剩下的參數就直接傳入給 statcast_search
讓他來處理就好,所以我們前面可以寫成:
def statcast_pitcher_search(pitchers_lookup: str | list[str],
season: str | list[str] = "2024",
game_type: str | GameType | list[str | GameType] = GameType.REGULAR_SEASON,
start_dt: str = "", end_dt: str = "",
month: str | Month | list[str | Month] = "",
opponent: str | MlbTeam | list[str | MlbTeam] = "") -> pd.DataFrame:
if not pitchers_lookup:
raise ValueError("pitchers_lookup is required")
params = {
"pitchers_lookup": pitchers_lookup,
"season": season,
"player_type": "pitcher",
"game_type": game_type,
"start_dt": start_dt,
"end_dt": end_dt,
"month": month,
"opponent": opponent
}
return statcast_search(**params)
這樣其實大概的投手搜尋功能就完成了,因為都給 statcast_search
處理的關係,我們也不用特別寫 Utils
去處理使用者傳入的參數。
pitchers_lookup
另外一個想特別提到的是,關於 pitchers_lookup
,他是可以傳入 list
的,像是如果我們想同時搜尋 山本由伸 跟 達比修有 的話,可以傳入 ["808967", "506433"]
(分別為他們的 MlbID
),不過這次我們不需要像 Month
等多選一樣使用 join
處理,原因是如果我們 requests
在傳入 params
的參數,如果是 list
的話,URL
會變成 pitchers_lookup[]=808967&pitchers_lookup[]=506433
兩個,而這也是 Savant API 目前可以接受的格式。我有試過像是 pitchers_lookup[]=808967,506433
或 pitchers_lookup[]=808967|506433
都會造成搜尋不到結果。
功能都完成後記得加上前面介紹的 Docstring 讓之後的開發者跟使用者更了解這個 function。
打者搜尋其實跟前面介紹的投手搜尋差不多,基本上就是把 pitchers
改成 batters
就好了,這樣就能建一個 statcast_batter_search
。像是這樣兩個長很像的 functions,有時候我們會把重複的部份抽出來,然後統一寫成一個 function 然後可能用傳入的 player_type
來決定要使用 pitcher
跟 batter
,這樣可以減少一些重複的程式碼,不過 function 的命名就會不太一樣,可能沒有那麼好懂。不過為了可讀性可能也會變成需要改動的時候要改不同的地方,簡單來說其實選擇哪種方式都會有取捨,可以根據當下的需求決定要用哪種方式。
接下來是可以拿到小聯盟 Statcast 資料的 function,他跟 statcast_search
不一樣的是他會用另外一個 API URL,來取得資料,另外要取得 Statcast 資料就要多加 chk_tracked_pitch=on
跟 minor=true
,但總的來說也是多加幾個參數傳入,跟 statcast_search
差不多。不過有一些 Enums
可能不能延續用,因為小聯盟會有些參數會有限制,像是 game_type
就會只有例行賽跟季後賽,可查詢的賽季也只有 2021 到 最新一季。還有幾個不一樣的地方,像是可以使用 level
去篩選是 A
還是 AAA
,以及所屬球隊的 hfTeamAffiliate
來篩選,畢竟多數人對小聯盟球隊的名稱沒那麼熟悉。等 minor_statcast_search
完成,也能一起連投打搜尋也一起完成,這樣我們的套件又更完整了。
今天主要是來介紹套件可以擴充哪些新功能,明天的話可能會來看我們這些 Functions 能不能再讓他們的 Performance 提升。
今天就到這邊,最後一樣謝謝大家耐心地看完,如果有任何問題與建議,歡迎留言告訴我,明天見,掰掰。